home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).zip / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).adf / ASo-Tools / Sources / LibList.asm < prev    next >
Assembly Source File  |  1994-03-29  |  5KB  |  252 lines

  1. * LibList.asm
  2. * display the names of resident libraries, along with their vital statistics.
  3. * CLI only, only allowed parameter: "IDs" forces a second list of the
  4. * libraries along with their IDStrings to be displayed.
  5. * uses OS2
  6.  
  7.     NOLIST
  8.     INCLUDE "dos/LVO.i"
  9.     INCLUDE "exec/LVO.i"
  10.     INCLUDE "dos/dos.i"
  11.     INCLUDE "exec/lists.i"
  12.     INCLUDE "exec/libraries.i"
  13.     INCLUDE "exec/memory.i"
  14.     INCLUDE "exec/execbase.i"
  15.     LIST
  16.  
  17. MAXSTR:     equ    100
  18.  
  19.     STRUCTURE LibInfo,0
  20.     ; (meine Erfindung, zur kompakten Speicherung der relevanten Daten)
  21.     APTR      li_next
  22.     UWORD      li_VecSize
  23.     UWORD      li_DataSize
  24.     UWORD      li_Version
  25.     UWORD      li_Revision
  26.     UWORD      li_Opens
  27.     STRUCT      li_Name,MAXSTR
  28.     STRUCT      li_ID,MAXSTR
  29.     LABEL      li_SIZEOF
  30.  
  31. ;Register-Variablen:
  32.  
  33. _DOSBase:    equr a5
  34. LibsAnchor:    equr d7
  35. display_ids:    equr d6
  36.  
  37. ;*********************************************************************
  38.  
  39.     SECTION prg,CODE
  40.  
  41. ;Dos-Library öffnen:
  42. _main:    OPENLIB DOSName(pc),36
  43.     tst.l    d0
  44.     beq    wrongdos
  45.     move.l    d0,_DOSBase
  46. ; Parameter abfragen (hier, da sonst die Abfrage wegen '?' erst nach dem
  47. ; Ausdruck der 1. Liste käme - ugly)
  48.     lea    Template(pc),a0
  49.     move.l    a0,d1
  50.     clr.l    -(sp)
  51.     move.l    sp,d2
  52.     moveq    #0,d3
  53.     CALLDOS ReadArgs
  54.     move.l    (sp)+,display_ids
  55.     move.l    d0,d1
  56.     beq    1$
  57.     CALL    FreeArgs
  58.     bra    2$
  59. 1$:    moveq    #0,display_ids
  60.  
  61. 2$:    CALLEXEC Forbid     ;keine Änderungen während des Lesens !
  62.  
  63.     moveq    #0,LibsAnchor
  64.     move.l    LibsAnchor,a2
  65.     move.l    LibList+LH_HEAD(a6),a3
  66.  
  67. LibsLoop:
  68.     tst.l    LN_SUCC(a3)
  69.     beq    EndLibList
  70.  
  71.     move.l    #li_SIZEOF,d0
  72.     move.l    #MEMF_CLEAR,d1
  73.     CALL    AllocVec
  74.     tst.l    d0
  75.     beq    EndLibList        ;Ende der Liste, weil kein Speicher
  76.     move.l    a2,d1    ;tst.l a2
  77.     beq    3$
  78.     move.l    d0,li_next(a2)
  79.     bra    4$
  80. 3$:    move.l    d0,LibsAnchor
  81. 4$:    move.l    d0,a2
  82.     lea    li_Name(a2),a0
  83.     move.l    LN_NAME(a3),a1
  84.     bsr    strncpy
  85.     lea    li_ID(a2),a0
  86.     move.l    LIB_IDSTRING(a3),a1
  87.     move.l    a1,d0
  88.     beq    2$
  89.     bsr    strncpy
  90. ; '\n' am Ende von li_ID einsetzen:
  91.     addq.w    #1,d0
  92.     beq    1$
  93. ; "ausreichend" kurzer ID-String: was steht am Ende ?
  94.     cmp.b    #10,-1(a0)
  95.     beq    2$
  96.     cmp.b    #10,-2(a0)
  97.     beq    2$
  98.     addq.w    #1,a0
  99. ; superlanger ID-String: wird einfach durch '\n' gekappt
  100. 1$:    move.b    #10,-(a0)
  101.  
  102. 2$:    move.w    LIB_NEGSIZE(a3),li_VecSize(a2)
  103.     move.w    LIB_POSSIZE(a3),li_DataSize(a2)
  104.     move.w    LIB_VERSION(a3),li_Version(a2)
  105.     move.w    LIB_REVISION(a3),li_Revision(a2)
  106.     move.w    LIB_OPENCNT(a3),li_Opens(a2)
  107.  
  108.     move.l    LN_SUCC(a3),a3
  109.     bra    LibsLoop
  110.  
  111. EndLibList:
  112.     CALL    Permit
  113.     lea    str1(pc),a0
  114.     move.l    a0,d1
  115.     CALLDOS PutStr
  116.  
  117. ; Libraries sortieren.
  118. ; Das geschieht wie folgt: es wird jeweils die erste LibInfo-Struktur
  119. ; aus der Liste ab (LibsAnchor) entfernt und - richtig - in eine neue ab
  120. ; (a4) eingefügt.
  121.  
  122.     move.l    LibsAnchor,a4    ;\
  123.     move.l    (a4),LibsAnchor ;| ersten Knoten in neue Liste verlagern
  124.     clr.l    li_next(a4)     ;/
  125. SortLoop:
  126.     tst.l    LibsAnchor
  127.     beq    EndSort
  128.     move.l    LibsAnchor,a3    ;\
  129.     move.l    (a3),LibsAnchor ;/ ausklinken
  130.     move.l    a4,a2        ;Vergleichszeiger
  131.     moveq    #0,d4        ;Zeiger, wo der Knoten davor steht
  132. 3$:    lea    li_Name(a3),a0
  133.     lea    li_Name(a2),a1
  134. 1$:    cmp.b    (a0)+,(a1)+
  135.     bne    2$
  136.     tst.b    -1(a0)
  137.     bne    1$
  138. 2$:    bgt    insert
  139.     move.l    a2,d4
  140.     move.l    li_next(a2),a2
  141.     move.l    a2,d0    ;tst.l a2
  142.     bne    3$
  143. insert: tst.l    d4
  144.     beq    1$
  145.     move.l    d4,a0
  146.     move.l    a3,(a0)         ;Zeiger auf den Knoten
  147.     move.l    a2,li_next(a3)  ;Zeiger im Knoten
  148.     bra    SortLoop
  149. 1$:    move.l    a3,a4        ;Zeiger auf den Knoten
  150.     move.l    a2,li_next(a3)  ;Zeiger im Knoten
  151.     bra    SortLoop
  152.  
  153. EndSort: move.l a4,LibsAnchor
  154.     move.l    LibsAnchor,a2
  155.  
  156. OutputLoop1:
  157.     move.l    a2,d0    ;tst.l a2
  158.     beq    EndLibsOut1
  159.  
  160.     move.w    li_Opens(a2),-(sp)
  161.     move.w    li_Revision(a2),-(sp)
  162.     move.w    li_Version(a2),-(sp)
  163.     move.w    li_DataSize(a2),-(sp)
  164.     move.w    li_VecSize(a2),d0
  165.     ext.l    d0
  166.     divu    #6,d0
  167.     move.w    d0,-(sp)
  168.     pea    li_Name(a2)
  169.     move.l    sp,d2
  170.     lea    format_string(pc),a0
  171.     move.l    a0,d1
  172.     CALL    VPrintf
  173.     lea    14(sp),sp
  174.  
  175.     move.l    li_next(a2),a2
  176.     bra    OutputLoop1
  177.  
  178. ; is the IDString-List to be printed ?
  179. EndLibsOut1:
  180.     tst.l    display_ids
  181.     beq    FreeMem
  182.  
  183. ; display IDString-List
  184.     lea    str3(pc),a0
  185.     move.l    a0,d1
  186.     CALL    PutStr
  187.  
  188.     move.l    LibsAnchor,a2
  189.  
  190. OutputLoop2:
  191.     move.l    a2,d0    ;tst.l a2
  192.     beq    FreeMem
  193.     tst.b    li_ID(a2)
  194.     beq    1$
  195.     pea    li_ID(a2)
  196.     pea    li_Name(a2)
  197.     move.l    sp,d2
  198.     lea    format_string2(pc),a0
  199.     move.l    a0,d1
  200.     CALL    VPrintf
  201.     addq.w    #8,sp
  202. 1$:    move.l    li_next(a2),a2
  203.     bra    OutputLoop2
  204.  
  205. FreeMem: move.l _AbsExecBase,a6
  206.     bra    2$
  207. 1$:    move.l    LibsAnchor,a1
  208.     move.l    li_next(a1),LibsAnchor
  209.     CALL    FreeVec
  210. 2$:    tst.l    LibsAnchor
  211.     bne    1$
  212. CloseDos:
  213.     CLOSELIB _DOSBase
  214. nodos:    moveq    #0,d0
  215.     rts
  216.  
  217. ;keine dos-library V36+
  218. wrongdos:
  219.     OPENLIB DOSName(pc),33
  220.     tst.l    d0
  221.     beq    nodos
  222.     move.l    d0,_DOSBase
  223.     CALLDOS Output
  224.     move.l    d0,d1
  225.     beq    CloseDos
  226.     lea    DOSName(pc),a0
  227.     move.l    a0,d2
  228.     move.l    #DOS36Len,d3
  229.     CALL    Write
  230.     bra    CloseDos
  231.  
  232. ;Stringkopie bis (max.) MAXSTR Zeichen:
  233. strncpy: moveq    #MAXSTR-1,d0
  234. 1$:    move.b    (a1)+,(a0)+
  235.     dbeq    d0,1$
  236.     move.b    #0,-(a0)
  237.     rts
  238.  
  239. ;*********************************************************************
  240.  
  241. DOSName:    DOSNAME
  242.         dc.b    " v36+ required",10
  243. DOS36Len:    equ    *-DOSName
  244. Template:    dc.b    "IDs/S",0
  245. format_string:    dc.b    "%-25s  %7d  %4d    %4d    %4d  %4d",10,0
  246. format_string2: dc.b    "%-25s ID = %s",0
  247. str1:    dc.b    "Name                      #Vectors  Data Version Revison Opens",10
  248.     dc.b    "==============================================================",10,0
  249. str3:    dc.b    10,"Libraries with ID strings:",10,0
  250.  
  251.     END
  252.